闲扯
听说 $AC$ 自动机上 $DP$ 都是套路,大概看了下,发现还真是,过来写篇题解,加深一下印象。
题面
Solution
直接计算显然很麻烦,根据数学课上老师讲的,考虑补集转换。
我们计算出不含任何一个模式串的串的个数,再用总方案数 $26^m$ 减去不合法的来得到答案。
这时候就要用到一个套路了。
我们设 $dp_{i,j}$ 表示,目前匹配了前 $i$ 个字符,目前在 $j$ 号节点上的方案数。
那么对于一个合法的点 $ch[j][k]$ ,我们有 $dp_{i+1,ch[j][k]}+=dp_{i,j}$ 。
其中 $dp_{0,0}=1$ 。
那么怎么判断 $ch[j][k]$ 是否合法呢?
考虑 $AC$ 自动机在匹配模式串时跳 $fail$ 的本质。
我们可以发现一个点合法,当且仅当它在 $fail$ 树上一直跳到根结点的过程中没有一个点是某个模式串的结尾。
这可以在处理 $fail$ 的时候,顺便处理了。
然后我们就可以得到一个复杂度为 $O(m\sum len)$ 的算法。
Code
1 |
|